package com.jean.init;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.jean.business.bean.ConfigInfo;
import com.jean.util.LoggerFactory;

/**
 * <一句话功能简述>系统配置 <功能详细描述>
 * 
 * @author Jean
 * @version [版本号, 2013年12月9日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class SystemConfig
{
    /**
     * 日志
     */
    private static Logger logger = LoggerFactory.getLogger();
    
    /**
     * 配置项内容
     */
    private static Map<String, ConfigInfo> configsMap =
        new TreeMap<String, ConfigInfo>();
    
    /**
     * <一句话功能简述>初始化系统配置 <功能详细描述>
     * 
     * @see [类、类#方法、类#成员]
     */
    public static void initConfigs()
    {
        initDBConfigs();
    }
    
    /**
     * <一句话功能简述>初始化数据库配置内容 <功能详细描述>
     * 
     * @see [类、类#方法、类#成员]
     */
    private static void initDBConfigs()
    {
        logger.info("init db configs...");
        SqlMapClient sqlMapClient = MusicContext.getSqlMapClient();
        List<ConfigInfo> configs = new ArrayList<>();
        try
        {
            configs = sqlMapClient.queryForList("queryAllConfigs");
        }
        catch (SQLException e)
        {
            logger.error("SqlMapClient queryAdminByAccount error", e);
            return;
        }
        if (CollectionUtils.isEmpty(configs))
        {
            logger.warn("configs in db is empty.");
            return;
        }
        Iterator<ConfigInfo> iterator = configs.iterator();
        String tempConfigName = "";
        while (iterator.hasNext())
        {
            ConfigInfo configInfo = (ConfigInfo)iterator.next();
            if (configInfo != null)
            {
                tempConfigName = configInfo.getConfigName();
                if (StringUtils.isNotBlank(tempConfigName))
                {
                    configsMap.put(tempConfigName, configInfo);
                }
            }
        }
    }
    
    /**
     * <一句话功能简述>通过配置项名称获取配置项值 <功能详细描述>
     * 
     * @param configName 配置项名称
     * @return 配置项值
     * @see [类、类#方法、类#成员]
     */
    public static String getConfigValue(String configName)
    {
        if (StringUtils.isBlank(configName))
        {
            logger.warn("config name is blank.");
            return "";
        }
        ConfigInfo configInfo = configsMap.get(configName);
        if (configInfo == null)
        {
            logger.warn("config info is null. configname: " + configName);
            return "";
        }
        return configInfo.getConfigValue();
    }
    
    /**
     * <一句话功能简述>通过配置项名称获取配置项值。值为空时，返回默认值defaultValue <功能详细描述>
     * 
     * @param configName 配置项名称
     * @param defaultValue 默认值
     * @return 配置项值
     * @see [类、类#方法、类#成员]
     */
    public static String getConfigValue(String configName, String defaultValue)
    {
        if (StringUtils.isBlank(configName))
        {
            logger.warn("config name is blank.");
            return defaultValue;
        }
        ConfigInfo configInfo = configsMap.get(configName);
        if (configInfo == null)
        {
            logger.warn("config info is null. configname: " + configName);
            return defaultValue;
        }
        return StringUtils.isEmpty(configInfo.getConfigValue()) ? defaultValue
            : configInfo.getConfigValue();
    }
    
    /**
     * <一句话功能简述>通过配置项名称获取配置信息 <功能详细描述>
     * 
     * @param configName 配置项名称
     * @return 配置项值
     * @see [类、类#方法、类#成员]
     */
    public static ConfigInfo getConfig(String configName)
    {
        if (StringUtils.isBlank(configName))
        {
            logger.warn("config name is blank.");
            return null;
        }
        return configsMap.get(configName);
    }
}
